﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AudiPyme.DAL
{
    public class PesoCifraNegocioFactory
    {
        //Calcula el peso para el parámetro facturación cifra de negocio asociado a una empresa
        public static double PesoEmpresaCifraNegocio(int Sector, int CifraNegocio)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            //Cogemos el Valor Medio de Cifra de Negocio para las MicroEmpresas según el Sector de la Empresa
            IQueryable<int> CifraNegoMicroempr = from p in agenteBD.PesoCifraNegocioEstablecer
                                                 where p.IdSector == Sector && p.IdTipoEmpresa == 1
                                                 select p.Valor;
            if (CifraNegoMicroempr.Count() == 0)
            {
                //ValorCentinela, no se ha encontrado el dato
                return -1.0;
            }
            //Cogemos el Valor Medio de Cifra de Negocio para las Empresas Pequeñas según el Sector de la Empresa
            IQueryable<int> CifraNegoPeqEmpr = from p in agenteBD.PesoCifraNegocioEstablecer
                                               where p.IdSector == Sector && p.IdTipoEmpresa == 2
                                               select p.Valor;
            if (CifraNegoPeqEmpr.Count() == 0)
            {
                //ValorCentinela, no se ha encontrado el dato
                return -1.0;
            }
            //Cogemos el Valor Medio de Cifra de Negocio para las Empresas Medianas según el Sector de la Empresa
            IQueryable<int> CifraNegoMedEmpr = from p in agenteBD.PesoCifraNegocioEstablecer
                                               where p.IdSector == Sector && p.IdTipoEmpresa == 3
                                               select p.Valor;
            if (CifraNegoMedEmpr.Count() == 0)
            {
                //ValorCentinela, no se ha encontrado el dato
                return -1.0;
            }
            int ValorMedioMicroEmpresa = CifraNegoMicroempr.First();
            int ValorMedioPeqEmpresa = CifraNegoPeqEmpr.First();
            int ValorMedioMedEmpresa = CifraNegoMedEmpr.First();
            double xa = -1.0, xb = -1.0, x = -1.0, ya = -1.0, yb = -1.0, y = -1.0;
            //Vemos que valores encapsulan a la cifra negocio de la empresa para fijar los valores
            //del intervalo
            //Si está por debajo del valor medio para las Microempresas
            if (CifraNegocio < ValorMedioMicroEmpresa)
            {
                x = CifraNegocio;
                xa = 0.0;
                xb = ValorMedioMicroEmpresa;
                ya = 0.0;
                yb = 0.25;
            }
            //Si es superior al valor medio de Microempresas, pero no supera al de Pequeñas Empresas
            else if (CifraNegocio < ValorMedioPeqEmpresa)
            {
                x = CifraNegocio;
                xa = ValorMedioMicroEmpresa;
                xb = ValorMedioPeqEmpresa;
                ya = 0.25;
                yb = 0.75;
            }
            //Sino, es porque es superior al valor medio de Pequeñas Empresas, pero no superior al de Medianas Empresas
            else if (CifraNegocio < ValorMedioMedEmpresa)
            {
                x = CifraNegocio;
                xa = ValorMedioPeqEmpresa;
                xb = ValorMedioMedEmpresa;
                ya = 0.75;
                yb = 1;
            }
            //Si es superior al valor Medio de la Mediana Empresa, se le da un peso de 1
            else
            {
                return 1;
            }
            y = EmpresasFactory.InterpolacionLineal(x, xa, xb, ya, yb);
            return y;
        }

        //Método que sirve para actualizar el Peso Cifra de Negocio de la empresa que se pasa por parámetros
        public static void ActualizaPesoCifraNegocio(int EmpresaUsuario, double PesoCifraNegocio)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<Empresas> EmpresaQuery = from Emp in agenteBD.EmpresasEstablecer
                                                where Emp.IdEmpresa == EmpresaUsuario
                                                select Emp;
            if (EmpresaQuery.Count() != 0)
            {
                Empresas Empresa = EmpresaQuery.First();
                Empresa.PesoNegocio = PesoCifraNegocio;
                agenteBD.SaveChanges();
            }
        }
    }
}
